
/*
 * @Descripttion: 用于快手极速版刷金币的脚本
 * @Author: 菜鸟黄某
 * @AutoXjs版本：6.5.7
 * @快手极速版版本：12.0.40.7282 (2024-02-02 最新版)
 * @Date: 2024-02-02 
 */
//导入模块



const tools = require('tools.js');
// const tools = require('Tools2.0.js');
let tasksarr = require('Tasks.js');

log("快手极速版脚本 启动")

const h = device.height || 2400,
    w = device.width || 1080;

//手机 数字类型的锁屏密码     
var //password = "751953",
    //汇报邮箱
    targetEmail = "623013649@qq.com",
    //完成状况
    scriptstate = "",
    //程序最大重试次数
    scripMaxRetryCount = 3,
    //脚本最大运行时间  单位:分钟
    maxRuntime = 40,
    //脚本启动时的时间
    startDate = new Date().getTime() + 8 * 60 * 60 * 1000,
    //不存在的任务
    unfindTasks = 0,
    unfindTasksName = "",
    appname = "快手极速版",
    _packageName = getPackageName(appname),
    //获取得金币数量
    begin_coinNum = 0,
    end_coinNum = 0;


//脚本结尾操作  sync() 把里面的函数加上同步锁，使得在同一时刻最多只能有一个线程执行这个函数
//@是否发送【qq邮箱通知】   @邮箱内容 
var exitEnd = sync(function (content, is_sendemail) {
    log(">>>>>>>>>>>>>>退出脚本准备<<<<<<<<<<<<<<<")
    begin_coinNum = tasksarr[0].begin_coinNum
    end_coinNum = tasksarr[0].end_coinNum
    //is_sendemail 默认为false
    is_sendemail = !!is_sendemail
    content += `脚本已运行：${Math.floor((new Date().getTime() + 8 * 60 * 60 * 1000 - startDate) / (60 * 1000))}分钟 \n剩余未完成任务：${tasksarr.length}\n其中无法执行的任务(无此任务/任务app未装)有:${unfindTasksName}\n脚本开始时的金币：${begin_coinNum}\n脚本结束时的金币：${end_coinNum}\n本次获取金币数量为：${end_coinNum - begin_coinNum}\n`
    log("脚本完成情况:\n" + content)
    //qq邮箱汇报  必须是qq邮箱app  微信关联qq邮箱即可在微信上直接查看脚本情况
    is_sendemail && tools.email(targetEmail, appname, content)
    sleep(3000)
    tools.killApp(appname)
    home()

    device.cancelKeepingAwake()//取消屏幕常亮
    threads.shutDownAll()//关闭所有子线程
    engines.myEngine().forceStop()//关闭当前脚本

})

//新建线程   专门处理广告倒计时
let thread1 = threads.start(function () {
    try {
        while (true) {
            let ad1 = id("com.kuaishou.nebula.commercial_neo:id/video_countdown").findOne(300)
            if (ad1 && ad1.text() == "已成功领取奖励") {
                log(`【找到[${ad1.text()}]并点击】:${tools.superClick(ad1)}`)
            }
            let ad2 = id("com.kuaishou.nebula:id/neo_count_down_text").findOne(400) || id("com.kuaishou.nebula.commercial_neo:id/reward_merchant_text").findOne(200) || id("com.kuaishou.nebula:id/pendant_task_status").findOne(200)
            if (ad2 && ad2.text().search(/[1-4]秒|00:0[1-4]|已领取|倒计时 00:0[1-4]/) == 0) {
                log(`[广告线程]-->" ${ad2.text()}\n`)
                sleep(5000);
                back()
                sleep(3000);
            }
            let ad3 = packageName(_packageName).textMatches(/(领取|奖励|立即|任务|退出|仍要|直播间|放弃){1,2}/).findOne(300) || className("android.widget.TextView").textStartsWith("看内容最高可得").findOne(200) || className("android.widget.Button").textStartsWith("看内容最高可得").findOne(200)
            if (ad3) {
                if (tools.superClick(ad3)) {
                    log(`【找到[${ad3.text()}]并点击】:true`)
                } else if (ad3.bounds().centerX() > 0 && ad3.bounds().centerY() > 0) {
                    click(ad3.bounds().centerX(), ad3.bounds().centerY());
                }

            }
        }
    } catch (e) {
        if (e.name == "JavaException") {
            log(">>>>>>>>>>>>>>>>广告线程退出<<<<<<<<<<<<<<<<<<<<")
        } else {
            scriptstate += `广告线程异常: 【${e.name}】\n${e.message}\n`
            log(`广告线程异常: 【${e.name}】\n${e.message}\n`)
            exitEnd(scriptstate, true)
        }

    }

});


try {
    init() && main()
} catch (error) {
    scriptstate += `主线程异常: 【${error.name}】\n${error.message}\n`
    log(`主线程异常: 【${error.name}】\n${error.message}\n`)
    //错误类型为 JavaException时 跳过重启任务 因为这是engines.stopAll()抛出异常导致的
} finally {
    exitEnd(scriptstate, true)
}


function main() {
    while (true) {

        let failcount = 0; //失败次数
        for (let i = 0; i < tasksarr.length; i++) {
            if (tools.backTo(text("任务中心"), 4)) {
                tasksarr[i].running();
            } else {
                failcount++;
            }
        }

        //失败次数太多
        if (failcount > 4) {
            log(`失败次数过多--> ${failcount}`)
            scriptstate += `失败次数过多--> ${failcount}\n`
            break;
        }
        //删掉已完成的数组元素
        tasksarr = tasksarr.filter(item => {
            if (item.state == "成功") {
                log(`<<<<<<<<<<<任务：${item.name}已从数组删除>>>>>>>>>>>>>>`)
            }
            if (item.state == "无法执行") {
                log(`<<<<<<<<<<<任务：${item.name}已从数组删除>>>>>>>>>>>>>>`)
                unfindTasks += 1;
                unfindTasksName += `${item.name} , `
            }
            return item.state != "成功" && item.state != "无法执行";
        });
        //剩余未完成任务 过少
        if (tasksarr.length - unfindTasks < 4) {
            throw new tools.UserErroyInfo("剩余任务过少", "剩余任务过少，脚本结束")
        }

    }

    // 重启任务
    tools.killApp(appname)
    if (thread1.isAlive()) {
        tools.killApp(appname)
        init()
    }

}


//初始操作
function init() {
    if (!!scripMaxRetryCount) {
        log(`>>>>>>>>>>>>>>剩余重试次数${scripMaxRetryCount}<<<<<<<<<<<<<`);
        scripMaxRetryCount--;

        //检测是否熄屏并开锁
        //tools.openPhone(password);
        //sleep(2000);
        //保持屏幕常亮
        device.keepScreenOn()
        tools.openApp(appname, 5000);
        sleep(2000)
        //任务中心
        if (tools.backTo(text("首页"), 3)) {
            let taskcenter = className("android.widget.CheckedTextView").text("去赚钱").findOne(2000)
            if (taskcenter) {
                log(`【找到[${taskcenter.text()}]并点击】:${tools.superClick(taskcenter)}`)
                sleep(5000)
                let signin = className("android.widget.Button").textMatches(/立即签到|今日签到/).findOne(2000);
                if(signin){
                    log(`【找到[${signin.text()}]并点击】:${tools.superClick(signin)}`)
                }
            } else {
                log("未找到任务中心入口 , 尝试坐标点击")
                tools.clicks(760, 2345)
            }
            return true
        }

    } else {
        exitEnd(scriptstate, true)
    }

}










